package ru.iteco.Java.study.MSGR;

/**
 * Connector - класс, управляющий всеми соединениями.
 * Хранит информацию о всех активных подключениях,
 * обеспечивает принятие запросов на подключение, 
 * создание запросов на подключение к др. пользователям,
 * отправку и принятие сообщений,...
 */
public class Connector {
	
	public Connector() {
		lst=new ConnectionList();
		this.listen();
	}
	
	/**
	 * метод listen() запускает процесс, 
	 * слушающий порт this.CurrentPort.
	 * В случае соединения, процесс вызывает
	 * событие FromOutside обработчику this.fol.
	 */
	public void listen()
	{
		fol=new FromOutsideListener(lst);//Event Listener
		pl=new PortListener(this.CurrentPort,fol);
		thr=new Thread(pl);//Запуск pl как самостоятельный поток
		thr.start();
	}
	
	/**
	 * создает новое соединение
	 * @param ip - адресс, к которому будет запрос на подключение
	 */
	public void askConnection(String ip)
	{
		this.con=new Connection(ip,this.CurrentPort);
		lst.add(con);
	}
	
	/**
	 * посылает сообщение mess по i-му соединению
	 * @param i - номер соединения в списке
	 * @param mess - текст сообщения
	 */
	public void sendMessage(int i,String mess)
	{
		lst.get(i).sendMessage(mess);
	}
	
	/**
	 * Тестирование класса Connector 
	 * @throws InterruptedException 
	 */
	public static void main(String[] args) throws InterruptedException {
		//создание класса, управляющего связью
		Connector con=new Connector();
		//после создания класса начинается автоматическое
		//прослушивание порта this.CurrentPort
		
		//запрашиваем соединение на порт this.CurrentPort
		con.askConnection("127.0.0.1");
		System.out.println("Тестирование передачи данных:");
		
		//отправляем сообщение по созданному соединению
		con.sendMessage(0,"Hello me!");
		//данные будут пойманы вложенным классом Receiver
		//из класса Connection, экземпляр которого был
		//создан в результате удачного соединения
		Thread.sleep(1*1000);//время на отправку данных
		System.exit(0);
	}
	
	private Connection con;//ссылка для работы с элементом списка
	public ConnectionList lst;//список действующих соединений
	private final int DefaultPort=7777;//порт по умолчанию
	private int CurrentPort=DefaultPort;//текущий порт
	private PortListener pl;//класс, слушающий порт CurrentPort
	FromOutsideListener fol;//обработчик события FromOutside
	Thread thr;//поток для объекта pl
}
